﻿using PFC.CustomControls;
using PFC.Program.Verification;
using PFC.Program.Verification.Pages;
using ScottPlot;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace PFC.Program.Profile.Pages
{
    /// <summary>
    /// Логика взаимодействия для Wallets.xaml
    /// </summary>
    public partial class Wallets : Page
    {
        /* Класс со свойствами для передачи их данных в кастомный ListBox */
        public class DataWallets
        {
            public string Name { get; set; }
            public string Balance { get; set; }                      
        }

        public Wallets()
        {
            InitializeComponent();

            double[] sums = { };            // суммы транзакций
            DateTime[] dates = { };         // даты транзакций
            double[] balanceValues = { };   // балансы кошельков
            string[] walletsName = { };     // названия кошельков

            // Передача кол-ва кошельков
            SqlDataReader readerCountWlt = ClassRequests.GetCountWallets();
            while (readerCountWlt.Read()) 
            { 
                GlobalVaribles.arrayWalletIDs = new int[Convert.ToInt32(readerCountWlt["amount"])];
                balanceValues = new double[Convert.ToInt32(readerCountWlt["amount"])];
                walletsName = new string[Convert.ToInt32(readerCountWlt["amount"])];
            }
            readerCountWlt.Close();
            CommonClass.GetConnection().Close();

            // Передача ID значений кошельков, баланса и названия в массивы
            SqlDataReader readerInfoWallets = ClassRequests.GetInfoAboutWallets();
            int i = 0; // итерация
            while (readerInfoWallets.Read()) 
            { 
                GlobalVaribles.arrayWalletIDs[i] = Convert.ToInt32(readerInfoWallets["wallet_ID"]);
                balanceValues[i] = Convert.ToInt32(readerInfoWallets["balance"]);
                walletsName[i] = readerInfoWallets["name"].ToString();
                i++; 
            }
            readerInfoWallets.Close();
            CommonClass.GetConnection().Close();

            // Создание графовой диаграммы
            for (i = 0; i < GlobalVaribles.arrayWalletIDs.Length; i++) 
            {
                // Передача кол-ва транзакций
                SqlDataReader readerCountTx = ClassRequests.GetCountTxs(GlobalVaribles.arrayWalletIDs[i]);
                while (readerCountTx.Read())
                {
                    sums = new double[Convert.ToInt32(readerCountTx["amount"])];
                    dates = new DateTime[Convert.ToInt32(readerCountTx["amount"])];
                }
                readerCountTx.Close();
                CommonClass.GetConnection().Close();

                if (sums.Length == 0)
                    continue;

                int index = 0;
                
                // Передача суммы транзакции
                SqlDataReader readerSumTx = ClassRequests.GetInfo_AboutTx(GlobalVaribles.arrayWalletIDs[i]);
                while (readerSumTx.Read())
                { sums[index] = Convert.ToInt32(readerSumTx["sum"]); index++; }
                readerSumTx.Close();
                CommonClass.GetConnection().Close();

                // Изменение суммы транзакций под график
                for (index = 0; index < sums.Length; index++)
                { try { sums[index + 1] = sums[index] + sums[index + 1]; } catch { } }
                index = 0;

                // Передача даты транзакции
                SqlDataReader readerDateTx = ClassRequests.GetInfo_AboutTx(GlobalVaribles.arrayWalletIDs[i]);
                while (readerDateTx.Read())
                { dates[index] = Convert.ToDateTime(readerDateTx["date"]); index++; }
                readerDateTx.Close();
                CommonClass.GetConnection().Close();

                // Конвертация из DateTime[] в double[]
                double[] conDates = dates.Select(x => x.ToOADate()).ToArray();

                GraphPlotBorder.Visibility = Visibility.Visible;
                GraphPlot.Plot.AddScatter(conDates, sums, label: $"{walletsName[i]}");

                GraphPlot.Refresh();
            }

            // Настройка окружения для графа
            GraphPlot.Plot.XAxis.DateTimeFormat(true);
            GraphPlot.Plot.XLabel("Дата и время");
            GraphPlot.Plot.YLabel("Сумма");
            GraphPlot.Plot.Legend(true, Alignment.UpperRight);

            // Передача общего баланса в тайтл круговой диаграммы
            i = 0;
            foreach (var elem in balanceValues)
                i += Convert.ToInt32(elem);
            string centerText = "Общий баланс: " + i.ToString() + " РУБ.";

            // Создание круговой диаграммы
            if (balanceValues.Length > 0)
            {
                PiePlotBorder.Visibility = Visibility.Visible;
                var pie = PiePlot.Plot.AddPie(balanceValues);
                pie.SliceLabels = walletsName;
                pie.ShowValues = true;
                pie.SliceLabelPosition = 0.7;
                pie.Size = .7;
                pie.SliceLabelColors = pie.SliceFillColors;
                PiePlot.Plot.Title(centerText, false, System.Drawing.Color.Black, 15f);
                PiePlot.Plot.Legend(true, Alignment.MiddleCenter);
            }
            else
                PiePlotBorder.Visibility = Visibility.Hidden;

            // Обновление диаграммы
            PiePlot.Refresh();

            /* Передача существующих кошельков данного пользователя */
            SqlDataReader readerInformation = ClassRequests.GetInfoAboutWallets();
            
            while (readerInformation.Read()) 
            {
                listWallets_Lbx.Items.Add(
                new DataWallets()
                {
                    Name = readerInformation["name"].ToString(),
                    Balance = readerInformation["balance"].ToString() + " РУБ.",
                } );
            }

            readerInformation.Close();
            CommonClass.GetConnection().Close();
        }

        /* Перейти на страницу создания нового кошелька */
        private void AddNewWallet_Wrap_Click(object sender, RoutedEventArgs e)
        {
            var ClickedButton = e.OriginalSource as NavButton;
            NavigationService.Navigate(ClickedButton.NavUri);
        }

        /* Переход на страницу выбранного кошелька из списка */
        private void listWallets_Lbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // Передача индекса выбранного кошелька из списка
            GlobalVaribles.selectWallet = GlobalVaribles.arrayWalletIDs[listWallets_Lbx.SelectedIndex];

            // Получение имени выбранного кошелька
            SqlDataReader readerName = ClassRequests.GetNameChooseWallet(GlobalVaribles.selectWallet);
            while (readerName.Read()) { GlobalVaribles.nameSelectedWallet = readerName["name"].ToString(); }
            readerName.Close();
            CommonClass.GetConnection().Close();

            // Получение баланса выбранного кошелька из списка
            SqlDataReader readerBalance = ClassRequests.GetInfo_AboutBalance(GlobalVaribles.selectWallet);
            while (readerBalance.Read()) { GlobalVaribles.balanceCurrentUser = Convert.ToInt32(readerBalance["balance"]); }
            readerBalance.Close();
            CommonClass.GetConnection().Close();

            this.NavigationService.Navigate(new Main());
        }
    }

    
}
